MapStruct একটি powerful Java লাইব্রেরি যা ডোমেইন অবজেক্ট থেকে DTO (Data Transfer Object) অথবা অন্য যেকোনো অবজেক্টে ডেটা ম্যাপিং বা কনভার্সন সহজ করে তোলে। MapStruct স্বয়ংক্রিয়ভাবে কোড জেনারেট করার মাধ্যমে compile-time এ ডেটা কনভার্সন প্রক্রিয়া সম্পন্ন করে, ফলে এটি রানটাইম পারফরম্যান্সে অতিরিক্ত ওভারহেড সৃষ্টি করে না। MapStruct এর মাধ্যমে ডেটা ম্যাপিং করার জন্য Mapper Interface ব্যবহার করা হয়।
এই টিউটোরিয়ালে, আমরা Mapper Interface এর ভূমিকা এবং এর কার্যকারিতা সম্পর্কে বিস্তারিত আলোচনা করব।
১. Mapper Interface কি?
Mapper Interface হল একটি বিশেষ ধরনের interface যা MapStruct ব্যবহারের জন্য তৈরি করা হয়। এটি মূলত @Mapper অ্যানোটেশন ব্যবহার করে ডিজাইন করা হয়, যা MapStruct কে জানিয়ে দেয় যে এটি একটি ম্যাপিং ইন্টারফেস এবং এর মধ্যে থাকা মেথডগুলির মাধ্যমে অবজেক্টগুলির মধ্যে ডেটা কনভার্সন করা হবে।
এটি MapStruct এর মূল উপাদান, যা ডোমেইন অবজেক্ট এবং DTO (বা অন্য অবজেক্ট) এর মধ্যে ডেটা কনভার্সন সম্পাদন করতে ব্যবহৃত হয়।
২. Mapper Interface এর ভূমিকা
Mapper Interface এর মাধ্যমে আপনি MapStruct কে বলে দেন কোন দুটি অবজেক্টের মধ্যে ডেটা ট্রান্সফার করতে হবে এবং কোন ফিল্ডগুলো ম্যাপ করতে হবে। এটি এমন একটি Interface যা MapStruct দ্বারা @Mapper অ্যানোটেশন ব্যবহার করে স্পষ্টভাবে ডোমেইন অবজেক্টগুলির মধ্যে ম্যাপিং সম্পর্কিত লজিক নির্ধারণ করে।
Mapper Interface এর প্রধান ভূমিকা:
- Data Mapping: Mapper Interface ডোমেইন অবজেক্ট এবং DTO এর মধ্যে ডেটা কপি করতে ব্যবহৃত হয়। এটি ডেটা ট্রান্সফার অবজেক্ট (DTO) এবং Entity ক্লাসের মধ্যে কনভার্সন বাস্তবায়ন করে।
- Auto Code Generation: MapStruct এই ইন্টারফেসের ভিত্তিতে কোড জেনারেট করে, ফলে আপনাকে কোন কনভার্সন কোড লিখতে হয় না।
- Custom Mapping Logic: Mapper Interface কাস্টম ম্যাপিংয়ের জন্য মেথড তৈরি করতে পারে, যেমন
expressionব্যবহার করে কাস্টম কনভার্সন ফাংশন যোগ করা।
৩. Mapper Interface এর উদাহরণ
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে: Car (ডোমেইন অবজেক্ট) এবং CarDTO (ডেটা ট্রান্সফার অবজেক্ট)। আমরা MapStruct ব্যবহার করে এই দুটি ক্লাসের মধ্যে ডেটা ম্যাপ করতে চাই।
৩.১ Car.java (Domain Object)
public class Car {
private String make;
private String model;
private int year;
// Getters and Setters
}
৩.২ CarDTO.java (DTO)
public class CarDTO {
private String make;
private String model;
// Getters and Setters
}
৩.৩ CarMapper.java (Mapper Interface)
এখন, MapStruct এর মাধ্যমে Car থেকে CarDTO তে ডেটা ম্যাপ করার জন্য আমাদের একটি Mapper Interface তৈরি করতে হবে:
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CarMapper {
// MapStruct কে জানিয়ে দেয় যে এটি ম্যাপিং ইন্টারফেস
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
// Mapping method
CarDTO carToCarDTO(Car car);
}
এখানে, @Mapper অ্যানোটেশন দিয়ে আমরা MapStruct কে জানাচ্ছি যে এটি একটি ম্যাপিং ইন্টারফেস। এই ইন্টারফেসের মধ্যে carToCarDTO মেথড ডোমেইন অবজেক্ট Car থেকে DTO CarDTO তে ডেটা ম্যাপ করবে।
৩.৪ Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
// Creating Car instance
Car car = new Car();
car.setMake("Toyota");
car.setModel("Corolla");
car.setYear(2020);
// Using MapStruct to map Car to CarDTO
CarDTO carDTO = CarMapper.INSTANCE.carToCarDTO(car);
// Print CarDTO
System.out.println("Car Make: " + carDTO.getMake());
System.out.println("Car Model: " + carDTO.getModel());
}
}
এখানে, আমরা CarMapper.INSTANCE.carToCarDTO(car) মেথডটি ব্যবহার করে Car থেকে CarDTO তে ডেটা ম্যাপ করছি। MapStruct স্বয়ংক্রিয়ভাবে ম্যাপিং কোড জেনারেট করবে।
৪. MapStruct Mapper Interface এর সুবিধা
- কোডের পুনঃব্যবহারযোগ্যতা: Mapper Interface আপনাকে কোড পুনরায় ব্যবহারযোগ্যভাবে তৈরি করতে সাহায্য করে।
- অটোমেটিক কোড জেনারেশন: MapStruct compile-time এ কোড জেনারেট করে, যা আপনাকে ম্যাপিং কোড লেখার ঝামেলা থেকে মুক্তি দেয়।
- কাস্টম ম্যাপিং: Mapper Interface ব্যবহার করে কাস্টম ম্যাপিং তৈরি করা যায়, যেমন একটি ফিল্ডের মান কনভার্ট করা বা একটি কাস্টম লজিক প্রয়োগ করা।
- পারফরম্যান্স: MapStruct runtime reflection ব্যবহার না করে, এতে compile-time code generation ব্যবহার করে, তাই এটি পারফরম্যান্সে আরও দক্ষ।
৫. Custom Mapping in Mapper Interface
MapStruct আপনাকে কাস্টম ম্যাপিং লজিক সংযোজন করতে সাহায্য করে। যেমন, যদি আপনি চান CarDTO এর year ফিল্ডকে কাস্টম ফরম্যাটে প্রদর্শন করতে, তবে আপনি এমন কাস্টম ফাংশন ব্যবহার করতে পারেন।
৫.১ Custom Mapping Example
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(target = "year", expression = "java(car.getYear() - 2000)")
CarDTO carToCarDTO(Car car);
}
এখানে, year ফিল্ডের জন্য কাস্টম কনভার্সন ফাংশন ব্যবহার করা হয়েছে, যা year থেকে 2000 বিয়োগ করবে।
৬. Spring Integration with Mapper Interface
MapStruct সহজে Spring Framework এর সাথে ইন্টিগ্রেট করা যায়। আপনি যদি @Mapper এ componentModel = "spring" যোগ করেন, তবে MapStruct আপনাকে Spring Beans হিসেবে Mapper ইন্টারফেস তৈরি করতে সাহায্য করবে। Spring এর মাধ্যমে আপনি Mapper কে ইনজেক্ট করতে পারেন।
৬.১ Spring Integration Example
@Mapper(componentModel = "spring")
public interface CarMapper {
CarDTO carToCarDTO(Car car);
}
এখানে, componentModel = "spring" ব্যবহারের মাধ্যমে CarMapper Spring Bean হিসেবে ব্যবহৃত হবে এবং Spring এর মধ্যে সহজে ইনজেক্ট করা যাবে।
সারাংশ
Mapper Interface হল MapStruct এর একটি গুরুত্বপূর্ণ উপাদান যা ডেটা কনভার্সনের জন্য একটি গাইডলাইন তৈরি করে। এটি @Mapper অ্যানোটেশন ব্যবহার করে তৈরি করা হয় এবং MapStruct এর মাধ্যমে অটোমেটিকভাবে ম্যাপিং কোড জেনারেট করতে সহায়তা করে। MapStruct Mapper Interface ব্যবহার করে ডোমেইন অবজেক্ট থেকে DTO তে বা অন্য অবজেক্টে ডেটা ম্যাপিং করতে পারে। এটি টাইপ সেফ এবং উচ্চ পারফরম্যান্স সমাধান প্রদান করে, বিশেষ করে compile-time কোড জেনারেশন ব্যবহার করার মাধ্যমে।
Read more